package com.ruoyi.common;

import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.StringWriter;
import java.util.*;

/**
 * 由Velocity生成打印内容，然后交前端打印
 */
public class VelocityUtil {
    /**
     * 初始化vm方法
     */
    public static void initVelocity()
    {
        Properties p = new Properties();
        try
        {
            // 加载classpath目录下的vm文件
            p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            // 定义字符集
            p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);
            // 初始化Velocity引擎，指定配置Properties
            Velocity.init(p);
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
    }

    /**
     * 使用数据，渲染指定的模板
     * @param tplName
     * @param data
     * @return
     */
    public static String render(String tplName, Map<String, Object> data){
        initVelocity();
        VelocityContext context = prepareContext(data);
        String template = getTemplate(tplName);

        // 渲染模板
        StringWriter sw = new StringWriter();
        Template tpl = Velocity.getTemplate(template, Constants.UTF8);
        tpl.merge(context, sw);
        return sw.toString();
    }

    /**
     * 设置模板变量信息
     *
     * @param data
     * @return 模板列表
     */
    public static VelocityContext prepareContext(Map<String, Object> data)
    {
        VelocityContext velocityContext = new VelocityContext();
        for(Map.Entry<String, Object> e: data.entrySet()){
            if(e.getValue() == null){
                velocityContext.put(e.getKey(), "");
            }else if(e.getValue() instanceof Date){
                velocityContext.put(e.getKey(), DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, (Date) e.getValue()));
            }else{
                velocityContext.put(e.getKey(), e.getValue());
            }
        }
        return velocityContext;
    }

    /**
     * 获取模板信息
     * @param tplName 生成的模板
     * @return 模板列表
     */
    public static String getTemplate(String tplName)
    {
        return  "print/"+tplName+".vm";
    }
}
